```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据库优化全指南 | 技术小馆</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.8;
        }
        h1, h2, h3, h4 {
            font-family: 'Noto Serif SC', serif;
            font-weight: 600;
            color: #111;
        }
        .hero {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .code-block {
            background-color: #282c34;
            border-radius: 8px;
        }
        .card {
            transition: all 0.3s ease;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
        }
        .highlight {
            position: relative;
        }
        .highlight:before {
            content: '';
            position: absolute;
            left: 0;
            bottom: 2px;
            width: 100%;
            height: 8px;
            background: rgba(125, 125, 255, 0.2);
            z-index: -1;
            transition: all 0.3s ease;
        }
        .highlight:hover:before {
            height: 100%;
            bottom: 0;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <section class="hero text-white py-20 px-4">
        <div class="container mx-auto max-w-5xl">
            <div class="flex flex-col items-center text-center">
                <h1 class="text-4xl md:text-5xl font-bold mb-6">数据库优化全指南</h1>
                <p class="text-xl md:text-2xl mb-8 max-w-3xl">从基础到高级：提升数据库性能的完整解决方案</p>
                <div class="flex space-x-4">
                    <a href="#intro" class="px-6 py-3 bg-white text-indigo-700 font-semibold rounded-lg hover:bg-gray-100 transition">开始阅读</a>
                    <a href="#summary" class="px-6 py-3 border-2 border-white text-white font-semibold rounded-lg hover:bg-white hover:text-indigo-700 transition">总结速览</a>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <main class="container mx-auto max-w-5xl px-4 py-12">
        <!-- Introduction -->
        <section id="intro" class="mb-16">
            <div class="bg-white rounded-xl shadow-md p-8 mb-8">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">前言</h2>
                <p class="text-lg mb-6">在任何一个项目中随着用户越来越多，数据也就越来越多，项目的响应速度也就越来越慢了，这是程序员最头疼的"优化"问题就出现。那如何去优化呢？</p>
                
                <div class="bg-blue-50 border-l-4 border-blue-500 p-4 mb-6 rounded-r">
                    <p class="text-blue-800">从解决问题的角度出发，我们得先了解到问题的原因；其次我们得有一套思考、判断问题的流程方式，让我们合理的站在哪个层面选择方案；最后从众多的方案里面选择一个适合的方案进行解决问题，找到一个合适的方案的前提是我们自己对各种方案之间的优缺点、场景有足够的了解，没有一个方案是完全可以通用的。</p>
                </div>
                
                <p class="text-lg">在大部分项目的中优化空间的最大的就是数据库，这篇文章就来聊一聊数据库该如何去优化。</p>
                
                <div class="mt-8 rounded-xl overflow-hidden">
                    <img src="https://cdn.nlark.com/yuque/0/2024/png/21449790/1706001895209-aab0b8cf-3d54-4966-8940-8495e98976a3.png" alt="数据库优化" class="w-full h-auto rounded-lg">
                </div>
            </div>
        </section>

        <!-- Database Slow Essence -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-md p-8">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">数据库慢的本质</h2>
                <p class="text-lg mb-6">任何一个数据库影响查询性能的主要有一下四种：</p>
                
                <div class="grid md:grid-cols-2 gap-6 mb-8">
                    <div class="bg-indigo-50 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3 text-indigo-700"><i class="fas fa-database mr-2"></i>数据总量</h3>
                        <p>数据量越多，查询性能越低</p>
                    </div>
                    <div class="bg-purple-50 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3 text-purple-700"><i class="fas fa-microchip mr-2"></i>CPU/磁盘负载</h3>
                        <p>高并发请求、复杂查询导致资源繁忙</p>
                    </div>
                    <div class="bg-blue-50 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3 text-blue-700"><i class="fas fa-search mr-2"></i>查找算法</h3>
                        <p>不同的查找算法效率差异显著</p>
                    </div>
                    <div class="bg-green-50 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3 text-green-700"><i class="fas fa-layer-group mr-2"></i>存储数据结构</h3>
                        <p>不同的存储结构(NoSQL)适用于不同场景</p>
                    </div>
                </div>
                
                <div class="bg-gray-50 p-6 rounded-lg">
                    <p class="mb-4">无论是哪种存储，数据量越少，自然查询性能就越高，随着数据量增多，资源的消耗（CPU、磁盘读写繁忙）、耗时也会越来越高。</p>
                    <p class="mb-4">而高负载造成原因有高并发请求、复杂查询等，导致CPU、磁盘繁忙等，而服务器资源不足则会导致慢查询等问题。</p>
                    <p>数据以哪种结构保存和查找的算法也是决定了查询的速度。</p>
                </div>
            </div>
        </section>

        <!-- Optimization Levels -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-md p-8">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">优化层面</h2>
                
                <div class="flex justify-center mb-8">
                    <img src="https://cdn.nlark.com/yuque/0/2022/png/21449790/1653565233900-15bcf22f-3e66-4d01-b3cf-0b9b61253d0d.png" alt="优化层面" class="rounded-lg max-w-full">
                </div>
                
                <div class="bg-yellow-50 border-l-4 border-yellow-500 p-4 mb-6 rounded-r">
                    <p class="font-semibold mb-2"><i class="fas fa-lightbulb mr-2 text-yellow-600"></i>关键原则</p>
                    <p>从底部到顶部优化是受益是最快的，从顶部到底部成本是最高的。</p>
                </div>
                
                <div class="space-y-4">
                    <p>然而一个简单的语句，无论如何优化加索引也是有局限的，当在具体实现这层没有任何优化空间的时候就得往上一层【存储结构】思考，思考是否从物理表设计的层面出发优化（如分库分表、压缩数据量等），如果是文档型数据库得思考下文档聚合的结果；如果在存储结构这层优化得没效果，得继续往再上一次进行考虑，是否关系型数据库应该不适合用在现在得业务场景？如果要换存储，那么得换怎样得NoSQL，如果还没效果再考虑硬件层面。</p>
                    <p>当然如果公司有钱，直接使用<span class="font-bold highlight">钞能力</span>，绕过了前面三层，这也是一种便捷的应急处理方式。</p>
                </div>
            </div>
        </section>

        <!-- Optimization Solutions -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-md p-8">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">优化方案</h2>
                
                <!-- Field Type Selection -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-blue-600"><i class="fas fa-check-circle mr-2"></i>选择合适的字段类型</h3>
                    <div class="bg-blue-50 p-6 rounded-lg mb-4">
                        <p class="font-semibold mb-2"><i class="fas fa-info-circle mr-2 text-blue-600"></i>基本原则：</p>
                        <p>通常情况下，应该选择可以<strong>正确存储数据的最小数据类型</strong>，更小的数据类型通常更快，因为它们占用更小的磁盘、内存和CPU缓存，但是要确保没有低估需要存储值得范围。</p>
                    </div>
                    
                    <div class="space-y-4">
                        <div class="flex items-start">
                            <div class="bg-blue-100 text-blue-800 rounded-full w-6 h-6 flex items-center justify-center flex-shrink-0 mt-1 mr-3">1</div>
                            <p>应该选择MySQL内建的类型（date、time等）存储时间，而不是字符串。</p>
                        </div>
                        <div class="flex items-start">
                            <div class="bg-blue-100 text-blue-800 rounded-full w-6 h-6 flex items-center justify-center flex-shrink-0 mt-1 mr-3">2</div>
                            <p>varchar(5)和varchar(200)存储'hello'的空间开销是一样的。但是varchar(5)对性能提升有很大的优势。更长的列会消耗更多的内存，因为mysql通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序等操作时会特别糟糕。所以最好的策略是只分配真正需要的空间。</p>
                        </div>
                        <div class="flex items-start">
                            <div class="bg-blue-100 text-blue-800 rounded-full w-6 h-6 flex items-center justify-center flex-shrink-0 mt-1 mr-3">3</div>
                            <p>尽量使用数字型字段（如性别，男：1 女：2），若只含数值信息的字段尽量不要设计为字符型，这会降低查询和连接的性能，并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符，而对于数字型而言只需要比较一次就够了。</p>
                        </div>
                    </div>
                </div>
                
                <!-- SQL Optimization -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-green-600"><i class="fas fa-code mr-2"></i>SQL优化</h3>
                    
                    <div class="space-y-6">
                        <!-- 1 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">1、尽量避免在字段开头模糊查询</h4>
                            <div class="code-block p-4 mb-4 rounded-lg">
                                <code class="text-sm text-gray-200">
                                    SELECT * FROM t WHERE username LIKE '%张%'
                                </code>
                            </div>
                            <p class="mb-3">会导致数据库引索引失效进行全表扫描。可以使用下面语句查询：</p>
                            <div class="code-block p-4 rounded-lg">
                                <code class="text-sm text-gray-200">
                                    SELECT * FROM t WHERE username LIKE '张%'
                                </code>
                            </div>
                        </div>
                        
                        <!-- 2 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">2、尽量避免进行null值的判断</h4>
                            <div class="code-block p-4 mb-4 rounded-lg">
                                <code class="text-sm text-gray-200">
                                    select * from t_user where sex is null
                                </code>
                            </div>
                            <p class="mb-3">会导致数据库引擎放弃索引进行全表扫描，使用下面SQL语句优化：</p>
                            <div class="code-block p-4 rounded-lg mb-3">
                                <code class="text-sm text-gray-200">
                                    select * from t_user where sex =0;
                                </code>
                            </div>
                            <p>可以给字段添加默认值0，对0值进行判断。</p>
                        </div>
                        
                        <!-- 3 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">3、尽量避免在where条件中等号的左侧进行表达式</h4>
                            <div class="code-block p-4 mb-4 rounded-lg">
                                <code class="text-sm text-gray-200">
                                    -- 全表扫描<br>
                                    SELECT * FROM T WHERE score/10 = 9<br>
                                    -- 走索引<br>
                                    SELECT * FROM T WHERE score = 10*9
                                </code>
                            </div>
                            <p>不要在where的左侧进行表达式、函数操作，会导致数据库引擎放弃索引进行全表扫描。</p>
                        </div>
                        
                        <!-- 4 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">4、让order by 走索引</h4>
                            <p class="mb-3">order by 条件要与where中条件一致，否则order by不会利用索引进行排序</p>
                            <div class="code-block p-4 rounded-lg mb-3">
                                <code class="text-sm text-gray-200">
                                    -- 不走age索引<br>
                                    SELECT * FROM t order by age;<br><br>
                                    -- 走age索引<br>
                                    SELECT * FROM t where age > 0 order by age;
                                </code>
                            </div>
                            <p>首先索引本身就是排序好的，在wehre条件过滤的时候走了索引，所以order by 直接使用索引就不要在排序了。<strong>如果没有过滤条件就不会走索引，oder by 会重新把数据进行排序。</strong></p>
                        </div>
                        
                        <!-- 5 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">5、避免出现select *</h4>
                            <p>select * 操作在任何类型数据库中都不是一个好的SQL编写习惯。使用select * 取出全部列，会让优化器无法完成索引覆盖扫描这类优化，会影响优化器对执行计划的选择，也会增加网络带宽消耗，更会带来额外的I/O,内存和CPU消耗。</p>
                        </div>
                        
                        <!-- 6 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">6、多表关联查询时，小表在前，大表在后</h4>
                            <p>在MySQL中，执行 from 后的表关联查询是从左往右执行的，第一张表会涉及到全表扫描，所以将小表放在前面，先扫小表，扫描快效率较高，在扫描后面的大表，或许只扫描大表的前100行就符合返回条件并return了。</p>
                        </div>
                        
                        <!-- 7 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">7、多次插入改为批量插入</h4>
                            <div class="code-block p-4 mb-3 rounded-lg">
                                <code class="text-sm text-gray-200">
                                    insert into T values(1,2); <br>
                                    insert into T values(1,3); <br>
                                    insert into T values(1,4);<br><br>
                                    ## 优化后<br>
                                    Insert into T values(1,2),(1,3),(1,4);
                                </code>
                            </div>
                        </div>
                    </div>
                </div>
                
                <!-- Index Optimization -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-purple-600"><i class="fas fa-sitemap mr-2"></i>索引优化</h3>
                    <div class="bg-purple-50 p-6 rounded-lg mb-4">
                        <p><strong>索引是一种特殊的文件，它们包含着对数据表里所有记录的引用指针</strong>。数据库索引是数据库管理系统中一个排序的数据结构，以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。</p>
                    </div>
                    <div class="bg-gray-50 p-6 rounded-lg">
                        <p><strong>索引用于加快数据的检索</strong>，类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量，类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。</p>
                    </div>
                </div>
                
                <!-- Reduce Data Volume -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-red-600"><i class="fas fa-compress-alt mr-2"></i>减少数据量</h3>
                    <div class="bg-red-50 p-6 rounded-lg mb-4">
                        <p>无论是哪种存储，数据量越少，自然查询性能就越高，随着数据量增多，资源的消耗（CPU、磁盘读写繁忙）、耗时也会越来越高。</p>
                    </div>
                    <p class="mb-6">减少数据量类型共有四种方案：数据序列化存储、数据归档、中间表生成、分库分表</p>
                    
                    <div class="grid md:grid-cols-2 gap-6">
                        <!-- 1 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">数据序列化存储</h4>
                            <div class="flex justify-center mb-4">
                                <img src="https://cdn.nlark.com/yuque/0/2022/png/21449790/1653795456722-ecdb9cfb-b135-4ffb-bede-bdfb270a2eb9.png" alt="数据序列化存储" class="rounded-lg max-w-full">
                            </div>
                            <p>在数据库以序列化存储的方式，对于一些不需要结构化存储的业务来说是一种很好减少数据量的方式，特别是对于一些M*N的数据量的业务场景，如果以M作为主表优化，那么就可以把数据量维持最多是M的量级。另外像订单的地址信息，这种业务一般是不需要根据里面的字段检索出来，也比较适合。<strong>简单理解就是把数据压缩一下储存。</strong></p>
                        </div>
                        
                        <!-- 2 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">数据归档</h4>
                            <div class="flex justify-center mb-4">
                                <img src="https://cdn.nlark.com/yuque/0/2022/png/21449790/1653795823055-759f65a0-ba37-46cd-ae65-09754fe75779.png" alt="数据归档" class="rounded-lg max-w-full">
                            </div>
                            <p>主要通过数据库作业把非热点数据迁移到历史表，如果需要查历史数据，可新增业务入口路由到对应的历史表（库）。别一次性迁移数量过多，建议低频率多次限量迁移。</p>
                        </div>
                        
                        <!-- 3 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">中间表生成</h4>
                            <p><strong>中间表（结果表）其实就是利用调度任务把复杂查询的结果跑出来存储到一张额外的物理表</strong>，因为这张物理表存放的是通过跑批汇总后的数据，因此可以理解成根据原有的业务进行了高度的数据压缩。</p>
                            <p class="mt-4">以报表为例，如果一个月的源数据有数十万，我们通过调度任务以月的维度生成，那么等于把原有的数据压缩了几十万分之一；接下来的季报和年报可以根据月报*N来进行统计，以这种方式处理的数据，就算三年、五年甚至十年数据量都可以在接受范围之内，而且可以精确计算得到</p>
                        </div>
                        
                        <!-- 4 -->
                        <div class="card p-6">
                            <h4 class="text-xl font-semibold mb-3">分库分表</h4>
                            <p>把数据拆分到不同的数据库或者不同的数据表中保存，最终减少业务表中的数据来提高查询效率。<strong>分库分表是一种优化成本很大的方案</strong>。这里给几点建议：</p>
                            <ul class="list-disc pl-6 mt-4 space-y-2">
                                <li>分库分表是实在没有办法的办法，应放到最后选择。</li>
                                <li>优先选择NoSQL代替，因为NoSQL诞生基本上为了扩展性与高性能。</li>
                                <li>究竟分库还是分表？量·则分表，并发高则分库。</li>
                            </ul>
                        </div>
                    </div>
                </div>
                
                <!-- Space for Time -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-yellow-600"><i class="fas fa-exchange-alt mr-2"></i>用空间换时间</h3>
                    <div class="bg-yellow-50 p-6 rounded-lg">
                        <p>该类型的两个方案都是用来应对高负载的场景，分布式缓存、一主多从，读写分离。在高并发的情况下可以使用分布式缓存来提高查询的性能。在查询次数非常的多的情况下利用一主多从架构来分担单台MySQL的压力。</p>
                    </div>
                </div>
                
                <!-- Storage System -->
                <div class="mb-10">
                    <h3 class="text-2xl font-semibold mb-4 text-indigo-600"><i class="fas fa-database mr-2"></i>选择合适的储存系统</h3>
                    <div class="bg-indigo-50 p-6 rounded-lg">
                        <p>NoSQL主要以下五种类型：键值型（Redis)、文档型（MongoDB)、列型（HBase)、图型(GraphDB)、搜素（ES)引擎 ，不同的存储系统直接决定了查找算法、存储数据结构，也应对了需要解决的不同的业务场景。NoSQL的出现也解决了关系型数据库之前面临的难题（性能、高并发、扩展性等）。</p>
                    </div>
                </div>
                
                <!-- Hardware -->
                <div>
                    <h3 class="text-2xl font-semibold mb-4 text-gray-600"><i class="fas fa-server mr-2"></i>硬件的优化</h3>
                    <div class="grid md:grid-cols-3 gap-6">
                        <div class="bg-gray-100 p-6 rounded-lg">
                            <h4 class="font-semibold mb-2"><i class="fas fa-memory mr-2"></i>更大的内存</h4>
                            <p>减少磁盘IO</p>
                        </div>
                        <div class="bg-gray-100 p-6 rounded-lg">
                            <h4 class="font-semibold mb-2"><i class="fas fa-microchip mr-2"></i>多核CPU</h4>
                            <p>可以提高MySQL的执行速度</p>
                        </div>
                        <div class="bg-gray-100 p-6 rounded-lg">
                            <h4 class="font-semibold mb-2"><i class="fas fa-hdd mr-2"></i>固态硬盘</h4>
                            <p>采用性能更好的固态硬盘</p>
                        </div>
                    </div>
                </div>
            </div>
        </section>
        
        <!-- Index Failure Scenarios -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-md p-8">
                <h2 class="text-3xl font-bold mb-6 text-gray-800">索引失效的场景</h2>
                
                <div class="space-y-6">
                    <!-- 1 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">1、在索引列上做了表达式计算</h3>
                        <div class="code-block p-4 mb-3 rounded-lg">
                            <code class="text-sm text-gray-200">
                                explain<br>
                                select * from employees where emp_no + 1 = 10003;
                            </code>
                        </div>
                        <p class="mb-3">此时的 explain 为 all。</p>
                        <p class="mb-3">将 条件改到where条件的右面 :</p>
                        <div class="code-block p-4 rounded-lg mb-3">
                            <code class="text-sm text-gray-200">
                                explain select * from exployee where emp_no = 10003 -1;
                            </code>
                        </div>
                        <p>此时的explain 为 const</p>
                    </div>
                    
                    <!-- 2 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">2、使用了左模糊</h3>
                        <div class="code-block p-4 mb-3 rounded-lg">
                            <code class="text-sm text-gray-200">
                                explain * from employees where first_name like '%Geo%'
                            </code>
                        </div>
                        <p class="font-semibold mb-2">解决方案:</p>
                        <p class="mb-3">尽量避免使用左连接, 如果避免不了, 可以考虑使用搜索引擎去解决;</p>
                        <div class="code-block p-4 rounded-lg">
                            <code class="text-sm text-gray-200">
                                explain * from employees where first_name like 'Geo%'
                            </code>
                        </div>
                    </div>
                    
                    <!-- 3 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">3、使用or查询的部分字段没有索引</h3>
                        <p class="mb-3">例如: first_name 有索引, last_name 没有索引, 则如下语句不能使用索引</p>
                        <div class="code-block p-4 rounded-lg mb-3">
                            <code class="text-sm text-gray-200">
                                explain<br>
                                select * from employees where first_name = 'Georgi' or last_name = 'Georgi';
                            </code>
                        </div>
                        <p class="font-semibold mb-2">解决方案:</p>
                        <p>额外添加 or 条件的索引, 这时候数据库会默认的将两个索引合并, 避免了全表扫描.</p>
                    </div>
                    
                    <!-- 4 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">4、字符串条件未使用 ''引起来</h3>
                        <p class="mb-3">符串条件未使用 ''引起来 (dept_no 为字符串)</p>
                        <div class="code-block p-4 rounded-lg mb-3">
                            <code class="text-sm text-gray-200">
                                explain <br>
                                select * from dept<br>
                                where dept_no = 3;
                            </code>
                        </div>
                        <p class="mb-3">结果type 为 all</p>
                        <p class="font-semibold">解决方案: 把deptno_no='3' , 规范的编写 sql</p>
                    </div>
                    
                    <!-- 5 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">5、索引字段建议添加 NOT NULL 约束</h3>
                        <p class="mb-2">单列索引无法存储null值, 复合索引无法存储全为null的值</p>
                        <p class="mb-2">查询时, 采用 is null 条件时, 不能利用到索引, 只能全表扫描</p>
                        <p class="mb-2">mysql 官方建议尽量把字段定义为 NOT NULL</p>
                        <p>把索引字段设置成 NOT NULL, 甚至可以把所有字段都设置为 NOT NULL, 并且为字段设置默认值</p>
                    </div>
                    
                    <!-- 6 -->
                    <div class="card p-6">
                        <h3 class="text-xl font-semibold mb-3">6、隐式转换导致索引失效</h3>
                        <p>在创建表的时候要尽量规范: 比如使用int 或者 bigint</p>
                    </div>
                </div>
            </div>
        </section>
        
        <!-- Summary -->
        <section id="summary" class="mb-16">
            <div class="bg-gradient-to-r from-blue-500 to-purple-600 rounded-xl shadow-md p-8 text-white">
                <h2 class="text-3xl font-bold mb-6">总结速览</h2>
                <div class="grid md:grid-cols-3 gap-6">
                    <div class="bg-white bg-opacity-20 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3"><i class="fas fa-lightbulb mr-2"></i>核心原则</h3>
                        <ul class="space-y-2">
                            <li>从简单到复杂优化</li>
                            <li>从低成本到高成本</li>
                            <li>数据量是性能的关键</li>
                        </ul>
                    </div>
                    <div class="bg-white bg-opacity-20 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3"><i class="fas fa-check-circle mr-2"></i>最佳实践</h3>
                        <ul class="space-y-2">
                            <li>选择合适的字段类型</li>
                            <li>优化SQL查询语句</li>
                            <li>合理使用索引</li>
                        </ul>
                    </div>
                    <div class="bg-white bg-opacity-20 p-6 rounded-lg">
                        <h3 class="text-xl font-semibold mb-3"><i class="fas fa-exclamation-triangle mr-2"></i>避免误区</h3>
                        <ul class="space-y-2">
                            <li>避免索引失效场景</li>
                            <li>不要过早优化</li>
                            <li>考虑成本效益</li>
                        </ul>
                    </div>
                </div>
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-10 px-4">
        <div class="container mx-auto max-w-5xl text-center">
            <h3 class="text-xl font-semibold mb-4">技术小馆</h3>
            <a href="http://www.yuque.com/jtostring" class="text-blue-400 hover:text-blue-300 transition">http://www.yuque.com/jtostring</a>
            <div class="mt-6">
                <p class="text-sm">© 2024 技术小馆. All rights reserved.</p>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true
            }
        });
    </script>
</body>
</html>
```